package cn.itsource.itsource.service.impl;

//import cn.itsource.itsource.config.alipay.AlipayService;
import cn.itsource.itsource.config.alipay.AlipayService;
import cn.itsource.itsource.domain.*;
import cn.itsource.itsource.domain.OrderProduct;
import cn.itsource.itsource.mapper.*;
import cn.itsource.itsource.service.IOrderAdoptService;
import cn.itsource.itsource.service.IOrderProductService;
import cn.itsource.itsource.util.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;

@Service
@Transactional
public class OrderProductServiceImpl implements IOrderProductService {
    @Autowired
    private OrderProductMapper orderProductMapper;

    @Autowired
    private OrderAddressMapper orderAddressMapper;

    @Autowired
    private WangLinMapper wangLinMapper;

    @Autowired //注入调用支付宝支付的业务方法
    private AlipayService alipayService;


    @Override
    public AjaxResult submitOrder(OrderProduct orderProduct) {
        //所有操作前，需要进行校验
        //1. 非空校验
        //2. 支付金额校验（后台需要再重新 计算一遍，如果后台计算的价格与前端计算的价格不匹配，无法保存订单）
        //3. 关联的宠物的信息也要校验（价格）


        //1. 先保存到订单地址表
        OrderAddress orderAddress = new OrderAddress();
        orderAddress.setFullAddress(orderProduct.getUserAddress().getFullAddress());
        orderAddress.setPhone(orderProduct.getUserAddress().getPhone());
        orderAddress.setCreateTime(new Date());
        //如果添加操作后，需要立马得到当前添加数据的 自增长主键，需要添加一个注解
        //@GeneratedValue(strategy = GenerationType.IDENTITY)
        orderAddressMapper.insert(orderAddress);
        //2.再保存到宠物领养订单表
        //TODO 核心点：将这个表中各种需要初始化的字段找到并赋值
        orderProduct.setAddressId(orderAddress.getId());
        //user_id已经在controller中获取到了
        //shop_id 这个值是根据pet_id查询宠物信息后，获取的
        WangLin wangLin = wangLinMapper.selectByPrimaryKey(orderProduct.getProductId());
        orderProduct.setShopId(wangLin.getShopid());

        //其他的默认值
        orderProduct.setState(0);//默认为【未支付】
        //生成一个订单编号
        orderProduct.setOrderSn(System.currentTimeMillis() + "");
        //添加提交时间
        orderProduct.setLastConfirmTime(new Date());

        orderProductMapper.insert(orderProduct);

        //3. 调用支付宝的支付接口
        //TODO 将每个商户对应的支付宝支付的核心参数，放到数据库中保存时
        //TODO 那么在调用支付接口时，就需要根据shop_id到 t_pay_alipay_info 查出对应的参数数据，再调用支付
        //
        String payUrl = alipayService.createPayUrl(orderProduct.getPrice(), orderProduct.getDigest(), orderProduct.getOrderSn(),wangLin.getShopid());


        return AjaxResult.success("操作成功").setData(payUrl);
    }

    @Override
    public void paySuccessOfUpdateOrderState(String out_trade_no, String trade_no) {
        Example example = new Example(OrderProduct.class);
        example.and().andEqualTo("orderSn", out_trade_no);
        //根据订单号只可能查出一条数据或0条数据
        OrderProduct orderProduct = orderProductMapper.selectOneByExample(example);
        //更新订单的相关支付参数
        orderProduct.setPaySn(trade_no);
        orderProduct.setLastPayTime(new Date());
        orderProduct.setState(1);//更新为【已支付】
        orderProductMapper.updateByPrimaryKeySelective(orderProduct);
    }


}
